GtkSwitch: Use gtk_widget_add_tick_callback
authorMatthias Clasen <mclasen@redhat.com>
Tue, 23 Sep 2014 15:22:12 +0000 (11:22 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 23 Sep 2014 15:23:20 +0000 (11:23 -0400)
This api automatically takes care of dealing with disappearing
frame clocks, which we currently forget to and pay with crashes.

gtk/gtkswitch.c

index 2050477e917f085cef464edc66c4561378659ccc..60cb64425e6f926d701bd9d68f2dd1fe235f51b6 100644 (file)
@@ -133,17 +133,17 @@ gtk_switch_end_toggle_animation (GtkSwitch *sw)
 
   if (priv->tick_id != 0)
     {
-      GdkFrameClock *clock = gtk_widget_get_frame_clock (GTK_WIDGET (sw));
-      g_signal_handler_disconnect (clock, priv->tick_id);
+      gtk_widget_remove_tick_callback (GTK_WIDGET (sw), priv->tick_id);
       priv->tick_id = 0;
-      gdk_frame_clock_end_updating (clock);
     }
 }
 
-static void
-gtk_switch_on_frame_clock_update (GdkFrameClock *clock,
-                                  GtkSwitch     *sw)
+static gboolean
+gtk_switch_on_frame_clock_update (GtkWidget     *widget,
+                                  GdkFrameClock *clock,
+                                  gpointer       user_data)
 {
+  GtkSwitch *sw = GTK_SWITCH (widget);
   GtkSwitchPrivate *priv = sw->priv;
   gint64 now;
 
@@ -169,6 +169,8 @@ gtk_switch_on_frame_clock_update (GdkFrameClock *clock,
     }
 
   gtk_widget_queue_draw (GTK_WIDGET (sw));
+
+  return G_SOURCE_CONTINUE;
 }
 
 #define ANIMATION_DURATION 100
@@ -190,11 +192,9 @@ gtk_switch_begin_toggle_animation (GtkSwitch *sw)
       priv->end_time = priv->start_time + 1000 * ANIMATION_DURATION;
       priv->offset = priv->handle_x;
       if (priv->tick_id == 0)
-        {
-          priv->tick_id = g_signal_connect (clock, "update",
-                                            G_CALLBACK (gtk_switch_on_frame_clock_update), sw);
-          gdk_frame_clock_begin_updating (clock);
-        }
+        priv->tick_id = gtk_widget_add_tick_callback (GTK_WIDGET (sw),
+                                                      gtk_switch_on_frame_clock_update,
+                                                      NULL, NULL);
     }
   else
     {